# -*- coding: utf-8 -*
import random, threading  #para las tarjetas de vida y la ruleta 

class Banco:
        cuentas = []
        def pagar(self, productor, cantidad):
                for cuenta in self.cuentas:
                        if cuenta.dueno.nombre == productor.nombre:
                                cuenta.setLeekels(cuenta.getLeekels() + cantidad)
                                cuenta.setAdeudo(cuenta.getAdeudo() + cantidad)
        def cobrar(self, productor, cantidad):
                if cantidad <= 0:
                        print "cantidad negativa"
                        return
                for cuenta in self.cuentas:
                        if cuenta.dueno.nombre == productor.nombre:
                                if cuenta.getLeekels() >= cantidad:
                                        cuenta.setLeekels(cuenta.getLeekels() - cantidad)
                                        cuenta.setAdeudo(cuenta.getAdeudo() - cantidad)
                                else:
                                        print "No se pudo cobrar la cantidad."
        
class ReciboCompras:
        articulos = []
        def agregarArticulo(self, articulo):
                self.articulos.append(articulo)

class Productor:
        leekels = 0
        nombre = ""
        unidadesMateriaPrima = 0
        productosTerminado = 0
        recibodeCompras = ReciboCompras()
	ventasCredito = 0       
	ventasContado = 0
 
        def __init__(self):
                print "dummy"
        def __init__(self, banco, nombre):
                self.nombre = nombre
                banco.cuentas.append(CuentaBancaria(self))
        def getLeekels(self):
                return self.leekels
        def setLeekels(self, nuevoValor):
                if nuevoValor < 0:
                        print "Error tratando de establecer valor de leekels: valor negativo"
                        return
                self.leekels = nuevoValor
        def retirar(self, banco, cantidad):
                for cuenta in banco.cuentas:
                        if cuenta.dueno.nombre == self.nombre:
                                if cuenta.getLeekels() < cantidad:
                                        print "Error retirando: no posée la cantidad a retirar"
                                        return
                                cuenta.setLeekels(cuenta.getLeekels() - cantidad)
                                self.setLeekels(self.getLeekels() + cantidad)
        def depositar(self, banco, cantidad):
                for cuenta in banco.cuentas:
                        if cuenta.dueno.nombre == self.nombre:
                                cuenta.setLeekels(cuenta.getLeekels() + cantidad)
                                self.setLeekels(self.getLeekels() - cantidad)
        def obtenerMateriaPrima(self, mayorista, unidades):
                self.leekels -= mayorista.getPrecioMateriaPrima()*unidades                                              
                self.unidadesMateriaPrima += unidades 
        def getUnidadesMateriaPrima(self):
                return self.unidadesMateriaPrima
        def setUnidadesMateriaPrima(self, nuevoValor):
                unidadesMateriaPrima = nuevoValor
        def devolverMateriaPrima(self, mayorista, unidades):
                self.leekels += (mayorista.getPrecioMateriaPrima()*unidades)/2
                self.unidadesMateriaPrima -= unidades
        def vender(self, vendedor, unidades): 
		if vendedor.__class__ == VendedorMinorista:
			self.cobrarContado(vendedor, unidades)
	def cobrarContado(self, vendedor, unidades):
		saldo = self.getLeekels() + vendedor.PRECIOCOMPRA * unidades
                self.setLeekels(saldo)
                self.productoTerminado -= unidades
                self.ventasContado += saldo
	def cobrarCredito(self, vendedor, posicion_ruleta, unidades):
		totalPagar = vendedor.PRECIOCOMPRA * unidades
		if posicion_ruleta == 2 or posicion_ruleta == 4:
			saldo =self.getLeekels() + totalPagar
			self.ventasCredito += totalPagar
		if posicion_ruleta == 3 or posicion_ruleta == 5 or posicion_ruleta == 6:
			saldo = self.getLeekels() + totalPagar/2
			self.ventasCredito += totalPagar/2
		self.productoTerminado
		self.setLeekels(saldo)
        def comprarEnSupermercado(self, supermercado, indiceArticulo, unidades):
                saldo = self.getLeekels() - supermercado.mostrarPrecio(indiceArticulo) * unidades
                self.setLeekels(saldo)
                articulo = supermercado.articulos[indiceArticulo]
                articulo.existencia = articulo.existencia - unidades
		if articulo.existencia <= 0:
			supermercado.eliminarArticulosSinExistencia()
		if self.recibodeCompras.articulos.count(articulo) > 0:
			self.recibodeCompras.articulos[self.recibodeCompras.articulos.index(articulo)].existencia += unidades
		else:
			articulo.existencia = unidades
			self.recibodeCompras.articulos.append(articulo)

        def producir(self, unidades):
                if self.unidadesMateriaPrima >= unidades:
                        self.productoTerminado = unidades
                        self.unidadesMateriaPrima -= unidades
                        return self.productoTerminado
                else:
                        return "no hay suficientes unidades solo hay ", self.unidadesMateriaPrima, " unidades"
        def tomarTarjeta(self, pilaTarjetas):
                numero = random.randint(1,10)
                tarjeta = pilaTarjetas.tarjetas[numero - 1]
                return tarjeta.evento
        def calcularUtilidad(self):
                gastos = 0
                for articulo in self.recibodeCompras.articulos:
                        gastos += articulo.precio * articulo.existencia
                self.ventasContado = self.ventasContado
                utilidad = self.ventasContado + self.ventasCredito - gastos
                return utilidad
	def girarRuleta(self, ruleta):
		# El productor gira la ruleta
		ruleta.posicion =random.randint(1,6)
		if ruleta.posicion == 1:
			return # incobrable
		if ruleta.posicion == 2:
			return # pagar 100% el jueves
		if ruleta.posicion == 3:
			return # pagar solo la mitad a fin de mes
		if ruleta.posicion == 4:
			return # pagar el 100% a fin de mes
		if ruleta.posicion == 5:
			return # pagar solo la mitad el jueves
		if ruleta.posicion == 6:
			return # pagar el jueves la mitad y la otra mitad el fin de semana

class Ruleta:
	posicion = 1

class CuentaBancaria:
        leekels = 0
        adeudo = 0
        # dueno = Productor()
        def __init__(self,dueno):
                self.dueno = dueno
        def getLeekels(self):
                return self.leekels
        def setLeekels(self, cantidad):
                self.leekels = cantidad
        def getAdeudo(self):
                return self.adeudo
        def setAdeudo(self, cantidad):
                self.adeudo = cantidad

class Tienda:
        nombre = ""

class ProveedorMayorista(Tienda):
        precioMateriaPrima = 40
        def getPrecioMateriaPrima(self):
                return self.precioMateriaPrima
        def setPrecioMateriaPrima(self, nuevoValor):
                self.precioMateriaPrima = nuevoValor
class Articulo:
        nombre = ""
        precio = 0
        tipo = ""
        existencia = 0
        
class Supermercado:
        articulos = []
        def agregarArticulo(self, nombre, precio, tipo, existencia):
                articulo = Articulo()
                articulo.nombre = nombre 
                articulo.precio = precio
                articulo.tipo = tipo
                articulo.existencia = existencia
                self.articulos.append(articulo)
        def eliminarArticulosSinExistencia(self):
                for articulo in self.articulos:
                        if (articulo.existencia == 0):
                                self.articulos.remove(articulo)
        def mostrarPrecio(self, indiceArticulo):
                articulo = self.articulos[indiceArticulo]
		return articulo.precio
                
class VendedorMinorista:
        PRECIOCOMPRA = 80

class TarjetaVidaCotidiana:
        evento = ""

class PilaTarjetas:
        tarjetas = []

class Cronometro(threading.Thread):
	estado = 0
	tiempoTranscurrido = 0
	def iniciar(self, minutos):
		return
	def parar(self, minutos):
		return
class Partida:
	cronometro = Cronometro()
	def iniciar(self):
		return

class Instructor:
	partida = Partida()
	def iniciarPartida(self):
		return
	def iniciarCronometro(self, minutos):
		return
	def pararCronometro(self):
		return

class TestClass:
        def __init__(self):
		# -- Actores
                banco = Banco() 
                productor = Productor(banco, "productor 1")
                mayoristasEnrique = ProveedorMayorista()
		supermercadodeMiguel = Supermercado()
		tiendadeSandra = VendedorMinorista()
	
		# -- Inicialización
		supermercadodeMiguel.agregarArticulo("1Kg de Salmón", 50, "Comida",10)
		supermercadodeMiguel.agregarArticulo("Camisa",40,"Ropa",3)
		supermercadodeMiguel.agregarArticulo("Barra de pan",3,"Comida",20)
		supermercadodeMiguel.agregarArticulo("Lentes",20,"Accesorios",5)
	
                # Pagar préstamo inicial
		print "* Pagar préstamo inicial"
                banco.pagar(productor, 200)
                productor.retirar(banco,200)
                print "Leekels: ", productor.getLeekels()

                # Cobrar préstamo inicial
		print "* Cobrar préstamo inicial"
                productor.depositar(banco,200)
                banco.cobrar(productor,200)
                print "Leekels: ", productor.getLeekels()
        
                # Depositar dinero en el banco
		print "* Depositar dinero en el banco"
                banco.pagar(productor, 400)
                productor.retirar(banco, 400)
                productor.depositar(banco,200)
                for cuenta in banco.cuentas:
                        if cuenta.dueno.nombre == productor.nombre:
                                print "Leekels(cuenta): ", cuenta.getLeekels()
                
                # Retirar dinero del banco
		print "* Retirar dinero del banco"
                productor.retirar(banco, 200)
                for cuenta in banco.cuentas:
                        if cuenta.dueno.nombre == productor.nombre:
                                print "Leekels(cuenta): ", cuenta.getLeekels()
                
                # Comprar materia prima
		print "* Comprar materia prima"
                productor.obtenerMateriaPrima(mayoristasEnrique,10)
                print "Leekels: ", productor.getLeekels()
                print "Materia prima: ", productor.getUnidadesMateriaPrima()

                # Devolver materia prima
		print "* Devolver materia prima"
                productor.devolverMateriaPrima(mayoristasEnrique,5)
                print "Leekels: ", productor.getLeekels()
                print "Materia prima: ", productor.getUnidadesMateriaPrima()       
                
		# Fabricar productos
		print "* Fabricar productos"
		productor.producir(5)
		print "Materia prima: ", productor.unidadesMateriaPrima
		print "Producto terminado: ", productor.productoTerminado

		# Comprar en supermercado
		print "* Comprar en supermercado"
		for articulo in supermercadodeMiguel.articulos:
			if articulo.nombre == "1Kg de Salmón":
				productor.comprarEnSupermercado(supermercadodeMiguel, supermercadodeMiguel.articulos.index(articulo), 2)
		for compra in productor.recibodeCompras.articulos:
			print "Nombre: %s; Precio: %d; Tipo: %s; Cantidad: %d"%(compra.nombre,compra.precio,compra.tipo,compra.existencia)
		print "Leekels: ", productor.getLeekels()
	
		# Vender a contado
		print "* Vender a contado"
		productor.vender(tiendadeSandra,5)
		print "Ventas a contado: ", productor.ventasContado
		print "Leekels: ", productor.getLeekels()
		print "Producto terminado: ", productor.productoTerminado
			
		# Calcular utilidad
		print "* Calcular utilidad"
		print "Utilidad: ", productor.calcularUtilidad()
TestClass()             
